/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.unesp.demac.bcc.soo.clarus.dao;

import br.unesp.demac.bcc.soo.clarus.bean.Aluno;
import br.unesp.demac.bcc.soo.clarus.bean.Emprestimo;
import br.unesp.demac.bcc.soo.clarus.bean.Obra;
import br.unesp.demac.bcc.soo.clarus.util.DateUtil;
import br.unesp.demac.bcc.soo.clarus.util.FabricaConexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author esaheki
 */
public class EmprestimoDAOImp implements EmprestimoDAO {
    
    @Override
    public boolean salvarEmprestimo(Emprestimo empr) throws SQLException{
        boolean salvo = false;
        final String QUERY = "INSERT INTO Emprestimo (idObra, idUsuario, dataEmprestimo) values (?, ?, ?)";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement psmt = null;
        ResultSet res = null;

        if (conn != null) {
            try {
                conn.setAutoCommit(false);
                
                for (Obra obra : empr.getObra()) {
                    psmt = conn.prepareStatement(QUERY);
                    psmt.setInt(1, obra.getIdObra());
                    psmt.setInt(2, empr.getAluno().getId());
                    psmt.setTimestamp(3, DateUtil.toSQLDate(empr.getDataEmprestimo()));
                    psmt.execute();
                }
                
                conn.commit();
                salvo = true;
            } catch (SQLException ex){
                System.out.println("Erro ao registrar emprestimo: " + ex.getMessage());
                throw ex;
            } finally {
                FabricaConexao.fechar(conn, psmt);
            }
        }

        return salvo;
    }
    
    @Override
    public Emprestimo getUltimoEmprestimoByIdObra(int idObra) throws SQLException {
        final String QUERY = "SELECT idEmprestimo, idObra, idUsuario, dataEmprestimo "
                + "FROM Emprestimo "
                + "WHERE idObra = ? AND dataDevolucao IS NULL;";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement psmt = null;
        ResultSet res = null;
        Emprestimo emprestimo = null;

        if (conn != null) {
            try {
                
                psmt = conn.prepareStatement(QUERY);
                psmt.setInt(1, idObra);
                res = psmt.executeQuery();
                
                if (res.next()) {
                    emprestimo = new Emprestimo();
                    emprestimo.setIdEmprestimo(res.getInt("idEmprestimo"));
                    emprestimo.setDataEmprestimo(DateUtil.fromSQLDate(res.getTimestamp("dataEmprestimo")));
                    
                    AlunoDAO adao = new AlunoDAOImp();
                    emprestimo.setAluno(adao.getAlunoByIdUsuario(res.getInt("idUsuario")));
                    
                    ObraDAO odao = new ObraDAOImp();
                    List<Obra> obras = new ArrayList<Obra>();
                    obras.add(odao.getObraById(idObra));
                    emprestimo.setObra(obras);
                }
            } catch (SQLException ex){
                System.out.println("Erro ao registrar emprestimo: " + ex.getMessage());
                throw ex;
            } finally {
                FabricaConexao.fechar(conn, psmt);
            }
        }

        return emprestimo;
    }
    
    @Override
    public boolean renovarEmprestimo(Emprestimo empr) throws SQLException {
        devolverEmprestimo(empr);
        empr.setDataEmprestimo(new Date());
        empr.setDataDevolucao(null);
        return salvarEmprestimo(empr);
    }
    
    @Override
    public boolean devolverEmprestimo(Emprestimo empr) throws SQLException {
        boolean salvo = false;
        final String QUERY = "UPDATE Emprestimo SET dataDevolucao = now() WHERE idEmprestimo = ?;";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement psmt = null;

        if (conn != null) {
            try {
                psmt = conn.prepareStatement(QUERY);
                psmt.setInt(1, empr.getIdEmprestimo());
                psmt.execute();
                salvo = true;
            } catch (SQLException ex) {
                System.out.println("Erro ao devolver emprestimo: " + ex.getMessage());
                throw ex;
            } finally {
                FabricaConexao.fechar(conn, psmt);
            }
        }

        return salvo;
    }
    
    public List<Emprestimo> getHistorico(Aluno aluno) {
        final String QUERY = "SELECT idEmprestimo, idObra, idUsuario, dataEmprestimo, dataDevolucao "
                + "FROM Emprestimo "
                + "WHERE idUsuario = ? "
                + "ORDER BY dataEmprestimo;";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement psmt = null;
        ResultSet res = null;
        List<Emprestimo> historico = new ArrayList<Emprestimo>();
        Emprestimo emprestimo = null;
        
        if (conn != null) {
            try {
                psmt = conn.prepareStatement(QUERY);
                psmt.setInt(1, aluno.getId());
                res = psmt.executeQuery();
                
                while (res.next()) {
                    emprestimo = new Emprestimo();
                    emprestimo.setIdEmprestimo(res.getInt("idEmprestimo"));
                    emprestimo.setDataEmprestimo(DateUtil.fromSQLDate(res.getTimestamp("dataEmprestimo")));
                    if (res.getTimestamp("dataDevolucao") == null){
                        emprestimo.setDataDevolucao(null);
                    } else {
                        emprestimo.setDataDevolucao(DateUtil.fromSQLDate(res.getTimestamp("dataDevolucao")));
                    }
                    
                    AlunoDAO adao = new AlunoDAOImp();
                    emprestimo.setAluno(adao.getAlunoByIdUsuario(res.getInt("idUsuario")));
                    
                    ObraDAO odao = new ObraDAOImp();
                    List<Obra> obras = new ArrayList<Obra>();
                    obras.add(odao.getObraById(res.getInt("idObra")));
                    emprestimo.setObra(obras);
                    
                    historico.add(emprestimo);
                }
            } catch (SQLException ex){
                System.out.println("Erro ao recuperar historico: " + ex.getMessage());
            } finally {
                FabricaConexao.fechar(conn, psmt);
            }
        }
        
        return historico;
    }
    
    public List<Emprestimo> getEmprestimoByIdObra(int idObra) {
        final String QUERY = "SELECT idEmprestimo, idObra, idUsuario, dataEmprestimo, dataDevolucao "
                + "FROM Emprestimo "
                + "WHERE idObra = ? "
                + "ORDER BY dataEmprestimo DESC;";
        Connection conn = FabricaConexao.getConexao();
        PreparedStatement psmt = null;
        ResultSet res = null;
        List<Emprestimo> historico = new ArrayList<Emprestimo>();
        Emprestimo emprestimo = null;
        
        if (conn != null) {
            try {
                psmt = conn.prepareStatement(QUERY);
                psmt.setInt(1, idObra);
                res = psmt.executeQuery();
                
                while (res.next()) {
                    emprestimo = new Emprestimo();
                    emprestimo.setIdEmprestimo(res.getInt("idEmprestimo"));
                    emprestimo.setDataEmprestimo(DateUtil.fromSQLDate(res.getTimestamp("dataEmprestimo")));
                    if (res.getTimestamp("dataDevolucao") == null){
                        emprestimo.setDataDevolucao(null);
                    } else {
                        emprestimo.setDataDevolucao(DateUtil.fromSQLDate(res.getTimestamp("dataDevolucao")));
                    }
                    
                    AlunoDAO adao = new AlunoDAOImp();
                    emprestimo.setAluno(adao.getAlunoByIdUsuario(res.getInt("idUsuario")));
                    
                    //ObraDAO odao = new ObraDAOImp();
                    //List<Obra> obras = new ArrayList<Obra>();
                    //obras.add(odao.getObraById(res.getInt("idObra")));
                    //emprestimo.setObra(obras);
                    
                    historico.add(emprestimo);
                }
            } catch (SQLException ex){
                System.out.println("Erro ao recuperar historico: " + ex.getMessage());
            } finally {
                FabricaConexao.fechar(conn, psmt);
            }
        }
        
        return historico;
    }
    
}
